"""
该页的功能是F:\Pycharm_WorkSpace\lemon_class31\lesson14_0730\demo2_excel的操作\demo5_read_excel封装2.py
的copy,只是有2处用列表推导式简化代码 第20行和第31行

2.实例属性不仅仅在init方法中定义，在任何方法中都可以定义实例属性
"""
import openpyxl
class Excel:
    def __init__(self,filename,sheet_name):
        self.filename = filename
        self.sheet_name = sheet_name
    def open(self):     # 读文件和写文件第一步和第二步是一样的，可以给他写到一个方法里，然后去调用
        # 第一步：将excel文件加载到一个工作簿对象中
        self.wb = openpyxl.load_workbook(self.filename)   # wb是一个局部变量，在res = list(sh.rows)中不能引用，
        # 第二步：选择文件中的表单           # 接上面的： 所以可以加self,self.wb保存为实例属性
        self.sh = self.wb[self.sheet_name]       # sh前面加self，保存为实例属性，=右边也需要加self

    def read_data(self):
        self.open()
        # 下面这一行是重点          # 前面加self，self.sh保存为实例属性 ，，sh是一个属性
        res = list(self.sh.rows)  # res是列表，列表中的元素是字典，每一个字典是excel的一行，可以在print(res)打断点调试
        # 获取第一行的单元格
        row1 = res[0]
        # 23到25行可以转为列表推导式 title = [c.value for c in row1]
        # title = [c.value for c in row1]
        # 获取第一行单元格的数据
        title = []
        for c in row1:
            title.append(c.value)
        # print(title)  # ['case_id', 'title', 'expected', 'data', 'result']

        # 遍历除第一行之外所有的行
        case_data = []
        for row in res[1:]:  # row代表元组 ，遍历第一行之外的所有行
            # 33到35可以简化为列表推导式 data = [c.value for c in row]
            # data = [c.value for c in row]        # 获取遍历出来的这一行的数据
            data = []
            for c in row:  # c代表单元格
                data.append(c.value)
            # print(data)                     # [1, '注册成功 ', '{"code": 1, "msg": "注册成功"}', '("python7","123456","123456")', None]
            case = dict(zip(title, data))  # 第一行和每一行都分别聚合打包
            # print(case)                  # 每次打印1个字典
            case_data.append(case)         # 一个列表中5个字典
        return case_data
    def write_data(self,row,column,value):
        self.open()
        # 第三步：往表格中写入数据                             # sh前面加self,保存为实例属性，其中sh为属性
        self.sh.cell(row=row,column=column,value=value)     # 写到工作簿对象wb中去，并没有写到excel文件中去
        #  第四步：保存
        self.wb.save(self.filename)                         # 加self保存为实例属性


# if __name__ == "__main__":
#     excel = Excel("cases.xlsx","login")
#     data = excel.read_data()
#     print(data)